import 'package:flutter/material.dart';

/**
 *  Future 是一个泛型,其中T代表的是我们耗时操作返回的具体值，如Future 表示一个未来的字符串，
    Future表示一个未来的布尔值，如果不需要返回值，可以使用Future。
    Future.value()：返回一个指定值的Future
    Future.delayed():返回一个延时执行的Future
    Future(() { ... return ... }） 返回异步的function
 */

class FutureDemoView extends StatefulWidget {
  const FutureDemoView({super.key});

  @override
  State<FutureDemoView> createState() => _FutureDemoViewState();
}

class _FutureDemoViewState extends State<FutureDemoView> {
  var numberValue = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Future 测试Demo'),
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          ElevatedButton(
              style: ButtonStyle(
                backgroundColor: MaterialStateProperty.all(Colors.blue),
                foregroundColor: MaterialStateProperty.all(Colors.white),
                elevation: MaterialStateProperty.all(20),
                shape: MaterialStateProperty.all(RoundedRectangleBorder(
                    borderRadius: BorderRadius.circular(10))),
              ),
              onPressed: () {
                _increateNumber();
              },
              child: const Text('数目+')),
          SizedBox(height: 50),
          Text('$numberValue')
        ],
      ),
    );
  }

  void _increateNumber() async {
    print('_increateNumber 开始执行增加数目的方法');
    //知识点1: Future 执行，必须有一个then 方法
    /*await*/ delNumber().then((value) {
      print('value 值：$value');
      // numberValue = value;
      value = value + 3;
      numberValue = value;
      return value;
    }).then((value) {
      print('value 值  第二次then  $value');
      setState(() {});
    }).whenComplete(() {
      print('执行了 whenComplete');
    });
    print('delNumber 下面的方法');
    //numberValue++;
  }

  Future<int> delNumber() {
    print('Future  delNumber');
    // return Future.value(numberValue++);
    // 知识点2： Future 有三种用法
    /*
    Future 是一个泛型,其中T代表的是我们耗时操作返回的具体值，如Future 表示一个未来的字符串，
    Future表示一个未来的布尔值，如果不需要返回值，可以使用Future。
    Future.value()：返回一个指定值的Future
    Future.delayed():返回一个延时执行的Future
    Future(() { ... return ... }） 返回异步的function
     */
    //第一种方法，Future.value()  返回
    //return Future.value(numberValue++);
    //第二种方法，Future.delayed()  返回
    /* return Future.delayed(Duration(seconds: 3), () {
      return 2;
    });*/
    //第三种方法 Future(() { ... return ... }） 返回异步的function

    return Future(() => numberValue++);
  }
}
